GtkCellRenderer *renderer,
GtkCellEditable *editable,
GtkIconView *icon_view);
+static void gtk_icon_view_context_changed (GtkCellAreaContext *context,
+ GParamSpec *pspec,
+ GtkIconView *icon_view);
/* Source side drag signals */
static void gtk_icon_view_drag_begin (GtkWidget *widget,
priv->remove_editable_id =
g_signal_connect (priv->cell_area, "remove-editable",
G_CALLBACK (gtk_icon_view_remove_editable), icon_view);
+ priv->context_changed_id =
+ g_signal_connect (priv->cell_area_context, "notify",
+ G_CALLBACK (gtk_icon_view_context_changed), icon_view);
return object;
}
if (priv->cell_area_context)
{
+ g_signal_handler_disconnect (priv->cell_area_context, priv->context_changed_id);
+ priv->context_changed_id = 0;
+
g_object_unref (priv->cell_area_context);
priv->cell_area_context = NULL;
}
G_OBJECT_CLASS (gtk_icon_view_parent_class)->dispose (object);
}
-
static void
gtk_icon_view_set_property (GObject *object,
guint prop_id,
gtk_tree_path_free (path);
}
+static void
+gtk_icon_view_context_changed (GtkCellAreaContext *context,
+ GParamSpec *pspec,
+ GtkIconView *icon_view)
+{
+ if (!strcmp (pspec->name, "minimum-width") ||
+ !strcmp (pspec->name, "natural-width") ||
+ !strcmp (pspec->name, "minimum-height") ||
+ !strcmp (pspec->name, "natural-height"))
+ gtk_icon_view_invalidate_sizes (icon_view);
+}
+
/**
* gtk_icon_view_set_cursor:
* @icon_view: A #GtkIconView
{
GList *items;
+ g_signal_handler_block (icon_view->priv->cell_area_context,
+ icon_view->priv->context_changed_id);
+
for (items = icon_view->priv->items; items; items = items->next)
{
GtkIconViewItem *item = items->data;
GTK_WIDGET (icon_view), NULL, NULL);
}
}
+
+ g_signal_handler_unblock (icon_view->priv->cell_area_context,
+ icon_view->priv->context_changed_id);
}
static void
gtk_icon_view_invalidate_sizes (GtkIconView *icon_view)
{
+ /* Clear all item sizes */
g_list_foreach (icon_view->priv->items,
(GFunc)gtk_icon_view_item_invalidate_size, NULL);
+
+ /* Reset the context */
+ g_signal_handler_block (icon_view->priv->cell_area_context,
+ icon_view->priv->context_changed_id);
+ gtk_cell_area_context_reset (icon_view->priv->cell_area_context);
+ g_signal_handler_unblock (icon_view->priv->cell_area_context,
+ icon_view->priv->context_changed_id);
+
+ /* Re-layout the items */
+ gtk_icon_view_queue_layout (icon_view);
}
static void
index = gtk_tree_path_get_indices(path)[0];
item = g_list_nth_data (icon_view->priv->items, index);
- gtk_icon_view_item_invalidate_size (item);
- gtk_icon_view_queue_layout (icon_view);
+ /* Here we can use a "grow-only" strategy for optimization
+ * and only invalidate a single item and queue a relayout
+ * instead of invalidating the whole thing.
+ *
+ * For now GtkIconView still cant deal with huge models
+ * so just invalidate the whole thing when the model
+ * changes.
+ */
+ gtk_icon_view_invalidate_sizes (icon_view);
verify_items (icon_view);
}
update_text_cell (icon_view);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "text-column");
}
update_text_cell (icon_view);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "markup-column");
}
update_pixbuf_cell (icon_view);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "pixbuf-column");
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
update_text_cell (icon_view);
update_pixbuf_cell (icon_view);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
update_text_cell (icon_view);
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "spacing");
}
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "row-spacing");
}
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "column-spacing");
}
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "margin");
}
gtk_cell_area_stop_editing (icon_view->priv->cell_area, TRUE);
gtk_icon_view_invalidate_sizes (icon_view);
- gtk_icon_view_queue_layout (icon_view);
g_object_notify (G_OBJECT (icon_view), "item-padding");
}